package cn.mujiankeji.mbrowser.界面.标签页.快照

import android.annotation.SuppressLint
import android.webkit.JavascriptInterface
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.statusBars
import androidx.compose.foundation.layout.windowInsetsTopHeight
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import cn.mujiankeji.mbrowser.app.应用接口
import cn.mujiankeji.mbrowser.app.应用操作.应用网页操作
import cn.mujiankeji.mbrowser.app.应用路由
import cn.mujiankeji.mbrowser.功能.浏览框.模型.浏览框页面配置
import cn.mujiankeji.mbrowser.功能.浏览框.浏览框加载状态
import cn.mujiankeji.mbrowser.功能.浏览框.浏览框状态
import cn.mujiankeji.mbrowser.功能.浏览框.浏览框视图
import cn.mujiankeji.mbrowser.工具.mlog
import cn.mujiankeji.mbrowser.工具.网络.网络操作
import cn.mujiankeji.mbrowser.数据.快照来源.快照来源接口
import cn.mujiankeji.mbrowser.数据.快照来源.快照源_视频
import cn.mujiankeji.mbrowser.数据.快照来源.快照源_阅读
import cn.mujiankeji.mbrowser.数据.枚举类.页面状态枚举
import cn.mujiankeji.mbrowser.数据.配置项.应用配置
import cn.mujiankeji.mbrowser.界面.小窗页.文本编辑窗口状态
import cn.nr19.jian.E2Factory
import cn.nr19.jian.`object`.JianLei
import com.blankj.utilcode.util.ResourceUtils
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext
import org.jsoup.Jsoup

class 快照状态_阅读(val 来源 : 快照源_阅读) : 快照状态() {
    override fun 来源(): 快照来源接口 = 来源

    override suspend fun CoroutineScope.加载(code: String) {
        super.加载进度.value = 90
        val jian= JianLei()
        withContext(Dispatchers.IO){
            super.标题.value = tryText(code,来源.标题,jian)
            正文内容 = tryText(code,来源.内容,jian)
            来源.上一章?.let { 上一章 = tryText(code,it,jian) }
            来源.下一章?.let { 下一章 = tryText(code,it,jian) }

            super.加载进度.value = 100
            super.状态.value = 页面状态枚举.完成
        }
    }


    var 浏览框 : 浏览框状态 = 浏览框状态(uuid = 标识,
        页面配置 = 浏览框页面配置("","",true,false),
        浏览框创建完毕 = {
            加载阅读器页面()
            false
        },
        响应状态更新 = {it->
            浏览框状态更新(it)
        },
        响应加载新的页面 = { url->
            应用路由.加载(url)
            true
        },
        响应可否加载文件 = { 地址 : String, 协议头 : Map<String,String>?->
            true
        },
        响应获取加载日记 = { listOf() },
        响应下载 = {url: String, userAgent: String?, contentDisposition: String?, mimetype: String?, contentLength: Long->
            应用网页操作.请求下载(url,userAgent, contentDisposition, mimetype, contentLength)
        },
        响应边缘颜色变化 = {顶部 : Int?,底部 : Int? -> },
        响应输入框 = {信息 : String,默认值 : String,回调 : (String?)->Unit ->
            文本编辑窗口状态(默认值,{信息}){
                回调(it)
            }.显示()
        },
        响应确认框 = {信息 : String,回调 : (Boolean)->Unit->
            应用接口.信息框(信息){
                回调(it)
            }
        },
        响应安装扩展或脚本 = {代码或地址 : String ->
            应用接口.安装扩展(代码或地址)
        },
        响应销毁页面 = {
            super.界面销毁()
        }
    )

    fun 浏览框状态更新(state : 浏览框加载状态){
        if (state == 浏览框加载状态.加载完毕){
            coroutine?.launch {
                浏览框.注入脚本("upContent()")
            }
        }
    }

    var 正文内容 : String by mutableStateOf("")
    var 上一章 by mutableStateOf("")
    var 下一章 by mutableStateOf("")


    inner class WebMx(){
        @JavascriptInterface
        fun upHeadColor(color : String){
            // 背景色变化 -- ColorUtils.string2Int(color)
        }

        @JavascriptInterface
        fun goNext(){
            跳转上一页()
        }

        @JavascriptInterface
        fun goPrev(){
            跳转下一页()
        }

        @JavascriptInterface
        fun getContent() : String {
            return 正文内容
        }

        @JavascriptInterface
        fun getTitle(): String {
            return 标题.value?:""
        }
        @JavascriptInterface
        fun loadSourceUrl(){
            // 加载原始页面
            应用路由.加载网页(来源.地址)
        }

        @JavascriptInterface
        fun getFontSize() : Int{
            return runBlocking { 应用配置.阅读器.字体大小().first() }
        }

        @JavascriptInterface
        fun upFontSize(i : Int){
            runBlocking {
                应用配置.阅读器.设置字体大小(i)
            }
        }

        @JavascriptInterface
        fun getVar(varSign : String): String {
            //return e2VarHelper?.getVar(varSign)
            return ""
        }


        @JavascriptInterface
        fun e2Rex(code : String,rule : String) : String{
            return E2Factory.text(code,rule, JianLei())
        }

        @JavascriptInterface
        fun getHttp(obj: String?): String {
            return runBlocking {
                网络操作.获取文本(obj?:return@runBlocking "") ?: ""
            }
        }

        @JavascriptInterface
        fun get1(url: String?) : String{
            return runBlocking {
                网络操作.获取文本(url?:return@runBlocking "") ?: ""
            }
        }
        

    }

    fun 跳转上一页(){
        if (上一章.isNotEmpty()){
            应用路由.加载(上一章 )
        }
    }
    fun 跳转下一页(){
        if (下一章.isNotEmpty()){
            应用路由.加载(下一章)
        }
    }


    @SuppressLint("JavascriptInterface")
    fun 加载阅读器页面(){
        coroutine?.launch {
            浏览框.webview?.addJavascriptInterface(WebMx(),"reader")
            var code = ResourceUtils.readAssets2String("reader/index.html")
            code = code.replace("##head##","")
            code = code.replace("##body##","")
            
            浏览框.webview?.loadDataWithBaseURL(来源.地址, code, "text/html", "UTF-8", null)
        }
    }

    fun 翻译(){
        浏览框.注入翻译脚本()
    }

}

@Composable
fun 快照实现_阅读(state : 快照状态_阅读) {


    快照页面布局(state,false){
        Column(Modifier.fillMaxSize()) {
            Spacer(Modifier.windowInsetsTopHeight(WindowInsets.statusBars))
            浏览框视图(state.浏览框)
        }

    }
}